﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using Montana.Entidades;

namespace Montana
{
    public partial class frmCuentaCorriente : Form
    {
        public frmCuentaCorriente()
        {
            InitializeComponent();
        }

        private void frmCuentaCorriente_Load(object sender, EventArgs e)
        {
            ArmarColumnasFacturas();
            
            Cliente cli = new Cliente();
            cli.CargarCombo(cboCliente, true);
        }


        private void cboCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboCliente.SelectedIndex == 0)
            {
                Limpiar();
                return;
            }

            int idCliente = (int)cboCliente.SelectedValue;

            CargarCuentaCorriente(idCliente);
        }

        private void ArmarColumnasFacturas()
        {
            lswDocumento.Columns.Add("Fecha", 80);
            lswDocumento.Columns.Add("Documento", 120);
            lswDocumento.Columns.Add("Debe", 80, HorizontalAlignment.Right);
            lswDocumento.Columns.Add("Haber", 80, HorizontalAlignment.Right);
            lswDocumento.Columns.Add("Debe (Kg.)", 80, HorizontalAlignment.Right);
            lswDocumento.Columns.Add("Haber (Kg.)", 80, HorizontalAlignment.Right);

            lswNoContable.Columns.Add("Fecha", 80);
            lswNoContable.Columns.Add("Documento", 120);
            lswNoContable.Columns.Add("Debe", 80, HorizontalAlignment.Right);
            lswNoContable.Columns.Add("Haber", 80, HorizontalAlignment.Right);
            lswNoContable.Columns.Add("Debe (Kg.)", 80, HorizontalAlignment.Right);
            lswNoContable.Columns.Add("Haber (Kg.)", 80, HorizontalAlignment.Right);
        }

        private void CargarCuentaCorriente(int idCliente)
        {
            this.Cursor = Cursors.WaitCursor;

            Factura fac = new Factura();
            Cliente cli = new Cliente();

            List<Factura> facturas = fac.BuscarPendientesBlanco(idCliente);

            decimal saldoAcumulado = cli.ObtenerSaldo(idCliente);
            decimal saldoAcumuladoKG = cli.ObtenerSaldoKG(idCliente);

            txtSaldoAnterior.Text = saldoAcumulado.ToString("0.00");
            txtSaldoAnteriorKG.Text = saldoAcumuladoKG.ToString("0.00");



            lswDocumento.Items.Clear();
            foreach (Factura f in facturas)
            {
                lswDocumento.Items.Add(f.Fecha.ToString("dd/MM/yyyy"));
                lswDocumento.Items[lswDocumento.Items.Count - 1].SubItems.Add("FC " + f.Letra + " " + f.Nombre);

                decimal importeTotal = f.Importetotal - (f.Importetotal * f.Porcentajebonificacion / 100);
                importeTotal += f.Importeiva;
                lswDocumento.Items[lswDocumento.Items.Count - 1].SubItems.Add(importeTotal.ToString("0.00"));
                lswDocumento.Items[lswDocumento.Items.Count - 1].Tag = f;

                //decimal cancelado = f.Saldocheques + (decimal)f.Saldoresagos;
                //if (f.Efectivoescontable == "S")
                //    cancelado += f.Importeentregado;
                //lswDocumento.Items[lswDocumento.Items.Count - 1].SubItems.Add(cancelado.ToString("0.00"));
                lswDocumento.Items[lswDocumento.Items.Count - 1].SubItems.Add(f.Importecancelado.ToString("0.00"));

                lswDocumento.Items[lswDocumento.Items.Count - 1].SubItems.Add(f.Totalresagosproductos.ToString("0.000"));
                lswDocumento.Items[lswDocumento.Items.Count - 1].SubItems.Add(f.Totalresagosentregados.ToString("0.000"));

                //saldoAcumulado += importeTotal - cancelado;
                saldoAcumulado += importeTotal - f.Importecancelado;
                saldoAcumuladoKG += f.Totalresagosproductos - f.Totalresagosentregados;
            }

            txtSaldoNuevo.Text = saldoAcumulado.ToString("0.00");
            txtSaldoNuevoKG.Text = saldoAcumuladoKG.ToString("0.000");

            //*** no contable
            saldoAcumulado = cli.ObtenerSaldo2(idCliente);
            saldoAcumuladoKG = cli.ObtenerSaldoKg2(idCliente);

            txtSaldoAnterior2.Text = saldoAcumulado.ToString("0.00");
            txtSaldoAnteriorKg2.Text = saldoAcumuladoKG.ToString("0.00");

            facturas = fac.BuscarPendientesNegro(idCliente);

            lswNoContable.Items.Clear();
            foreach (Factura f in facturas)
            {
                decimal cancelado = f.Saldocheques + (decimal)f.Saldoresagos + f.Importecancelado;
                if (f.Efectivoescontable == "N")
                    cancelado += f.Importeentregado;

                if (f.Importetotal == 0 && cancelado == 0)
                    continue;

                lswNoContable.Items.Add(f.Fecha.ToString("dd/MM/yyyy"));
                lswNoContable.Items[lswNoContable.Items.Count - 1].Tag = f;
                lswNoContable.Items[lswNoContable.Items.Count - 1].SubItems.Add("FC " + f.Letra + " " + f.Nombre);
                lswNoContable.Items[lswNoContable.Items.Count - 1].SubItems.Add(f.Importetotal.ToString("0.00"));
                lswNoContable.Items[lswNoContable.Items.Count - 1].SubItems.Add(cancelado.ToString("0.00"));
                lswNoContable.Items[lswNoContable.Items.Count - 1].SubItems.Add(f.Totalresagosproductos.ToString("0.000"));
                lswNoContable.Items[lswNoContable.Items.Count - 1].SubItems.Add(f.Totalresagosentregados.ToString("0.000"));

                saldoAcumulado += f.Importetotal - cancelado;
                saldoAcumuladoKG += f.Totalresagosproductos - f.Totalresagosentregados;
            }

            txtSaldoNoContable.Text = saldoAcumulado.ToString("0.00");
            txtSaldoNoContableKG.Text = saldoAcumuladoKG.ToString("0.000");

            this.Cursor = Cursors.Default;
        }

        private void Limpiar()
        {
            
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void txtCodigoCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                e.Handled = true;

                if (txtCodigoCliente.Text == "")
                {
                    return;
                }

                Cliente cli = new Cliente();

                List<Cliente> items = cli.BuscarPorCodigo(txtCodigoCliente.Text);

                if (items.Count == 0)
                {
                    return;
                }

                cboCliente.SelectedValue = items[0].ID.ToString();                
            }
        }

        private void txtCodigoCliente_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (Validacion.ValDecimal(txtSaldoAnterior) >= 0)
            {
                Validacion.MostrarMensaje("El cliente no tiene saldo a favor para cancelar documentos");
                return;
            }

            if (lswDocumento.SelectedItems.Count == 0)
                return;

            Factura f = (Factura)lswDocumento.SelectedItems[0].Tag;
            f = f.BuscarPendienteBlancoPorID(f.ID);

            decimal importeTotal = f.Importetotal - (f.Importetotal * f.Porcentajebonificacion / 100);
            importeTotal += f.Importeiva;
            decimal pendiente = Math.Round(importeTotal - f.Importecancelado, 2, MidpointRounding.AwayFromZero);

            decimal maximo = Validacion.ValDecimal(txtSaldoAnterior) * -1;
            decimal saldo = Validacion.ValDecimal(txtSaldoAnterior) * -1;

            if (pendiente < saldo)
                maximo = pendiente;

            frmInputBox frm = new frmInputBox("Importe a Cancelar", "El Importe Máximo a Cancelar es $" + maximo.ToString("0.00"));
            
            decimal cancela = 9999999;
            while (cancela > maximo)
            {
                frm.ShowDialog();
                if (frm.DialogResult == DialogResult.Cancel)
                    return;                

                cancela = Validacion.ValDecimal(frm.Valor);

                if (cancela != 9999999 && cancela > maximo)
                    Validacion.MostrarMensaje("El importe a cancelar debe ser menor o igual a $" + maximo.ToString("0.00"));
            }

            f.CancelarConSaldo(f.ID, f.IDCliente, cancela);

            //actualiza los valores
            CargarCuentaCorriente(f.IDCliente);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (Validacion.ValDecimal(txtSaldoAnterior2) >= 0)
            {
                Validacion.MostrarMensaje("El cliente no tiene saldo a favor para cancelar documentos");
                return;
            }

            if (lswNoContable.SelectedItems.Count == 0)
                return;

            Factura f = (Factura)lswNoContable.SelectedItems[0].Tag;
            f = f.BuscarPendienteNegroPorID(f.ID);

            decimal importeTotal = f.Importetotal - (f.Importetotal * f.Porcentajebonificacion / 100);
            //importeTotal += f.Importeiva;
            decimal pendiente = Math.Round(importeTotal - f.Importecancelado, 2, MidpointRounding.AwayFromZero);

            decimal maximo = Validacion.ValDecimal(txtSaldoAnterior2) * -1;
            decimal saldo = Validacion.ValDecimal(txtSaldoAnterior2) * -1;

            if (pendiente < saldo)
                maximo = pendiente;

            frmInputBox frm = new frmInputBox("Importe a Cancelar", "El Importe Máximo a Cancelar es $" + maximo.ToString("0.00"));

            decimal cancela = 9999999;
            while (cancela > maximo)
            {
                frm.ShowDialog();
                if (frm.DialogResult == DialogResult.Cancel)
                    return;

                cancela = Validacion.ValDecimal(frm.Valor);

                if (cancela != 9999999 && cancela > maximo)
                    Validacion.MostrarMensaje("El importe a cancelar debe ser menor o igual a $" + maximo.ToString("0.00"));
            }

            f.CancelarConSaldo2(f.ID, f.IDCliente, cancela);

            //actualiza los valores
            CargarCuentaCorriente(f.IDCliente);
        }
    }
}
